#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <cstdlib>
using namespace std;

////////////////////////////////////////////////////////////////////////////////
LecteurSymbole::LecteurSymbole(string nomFich) :
	lc(nomFich), symCour("") {
	suivant(); // pour lire le premier symbole
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::suivant() {
	sauterSeparateurs();
        if(lc.getCarCour() == '#') {
            sauterCommentaires();
        }
	// on est maintenant positionne sur le premier caractère d'un symbole
	ligne=lc.getLigne();
	colonne=lc.getColonne();
	symCour=Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterSeparateurs() {
	while (lc.getCarCour()==' '  || 
		   lc.getCarCour()=='\t' || 
		   lc.getCarCour()=='\r' || 
		   lc.getCarCour()=='\n')
		lc.suivant();
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterCommentaires() {
    lc.suivant();
    while(lc.getCarCour() != '\n') {
        lc.suivant();
    }
    sauterSeparateurs();
    if(lc.getCarCour() == '#') {
        sauterCommentaires();
    }
}

////////////////////////////////////////////////////////////////////////////////
string LecteurSymbole::motSuivant() {
	static string  s;
	s="";
	if (isdigit(lc.getCarCour()))
		// c'est le début d'un entier
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isdigit(lc.getCarCour()));

	else if (isalpha(lc.getCarCour()))
		// c'est le début d'un mot
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isalpha(lc.getCarCour())  || 
				 isdigit(lc.getCarCour()) || 
				 lc.getCarCour()=='_');
	else if (lc.getCarCour() == '"')
        //C'est le début d'une chaine de caractères
    {
        do {
            s = s + lc.getCarCour();
            lc.suivant();
        }while(lc.getCarCour() != '"' && lc.getCarCour() != '\n' && lc.getCarCour() != ';' && lc.getCarCour() != EOF);
        if(lc.getCarCour() != '"') {
            return s;
        }
        else {
            s = s + lc.getCarCour();
            lc.suivant();
        }
    }
    else if (lc.getCarCour() == '!') {
        s = lc.getCarCour();
        lc.suivant();
        s = s + lc.getCarCour();
        lc.suivant();
    }
    else if (lc.getCarCour() == '=' || lc.getCarCour() == '<' || lc.getCarCour() == '>') {
        s = s + lc.getCarCour();
        lc.suivant();
        if(lc.getCarCour() == '=') {
            s = s + lc.getCarCour();
            lc.suivant();
        }
    }
	else if (lc.getCarCour()!=EOF)
	// c'est un caractere special
	{
		s=lc.getCarCour();
        
		lc.suivant();
	}
        
	return s;
}
